package collection;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

/**
 * 集合的遍历
 * Collection提供了方法:
 * Iterator iterator()
 *                      die
 * 集合提供了统一的遍历方式:迭代器模式
 *
 * 迭代器遍历集合遵循的过程:问->取->删
 * 其中删除操作不是遍历过程的必要操作
 *
 */
public class IteratorDemo {
    public static void main(String[] args) {
        //集合支持泛型, 用于明确集合中的元素类型
        Collection<String> c = new ArrayList<>();
        c.add("one");
        c.add("#");
        c.add("two");
        c.add("#");
        c.add("three");
        c.add("#");
        c.add("four");
        c.add("#");
        c.add("five");
//        c.add(123);//add(E e), 由于泛型是<String>, 实参不是String类型, 编译不通过
        /*
            获取遍历该集合的迭代器
            不同的集合都提供了一个可以遍历自身元素的迭代器实现类
         */
        //迭代器通常也应当指定泛型, 与其遍历的集合指定的泛型一致即可
        Iterator<String> it = c.iterator();
        /*
            迭代器中重要的方法:
            boolean hasNext()
            判断是否还有下一个元素可供遍历

            E next()
            让迭代器移动到下一个元素的位置并获取该元素
         */
        while (it.hasNext()){
            String e = it.next();//指定泛型后获取元素时无需造型
            //if(e.equals("#")){//避免使用变量.equals(字面量)，有可能引发空指针异常
            if("#".equals(e)){
                /*
                    c.remove(e);//报错, ConcurrentModificationException
                    迭代器有一个要求:遍历的过程中不可以通过集合的方法增删元素，否则会抛出异常
                    ConcurrentModificationException
                    并发修改异常
                 */
                /*
                    迭代器提供了remove方法，用于删除本次next获取的元素
                    remove方法不能连续调用。调用remove的前提是调用一次next方法。
                 */
                it.remove();
            }
            System.out.println(e);
        }
        System.out.println(c);//[one, two, three, four, five]
    }
}
